create database DB;
use DB;
create table persona(
id_persona int primary key,
identificacion varchar(15),
nombre varchar(200),
imagen image,
apellido varchar(100),
email varchar(100),
telefono varchar(100),
direccion varchar(200),
estado varchar(1)
);

create table usuario(
id_usuario int primary key,
persona int,
tipo_usuario int not null,
nombre_usuario varchar(50),
contrasena binary(100),
estado varchar(1)
);

create table tipo_usuario(
id_tipo_usuario int primary key,
descripcion varchar(50)
);

create table documento_cab(
id_doc_cab int primary key,
cod_documento varchar(20),
tipo_doc varchar(3),
fecha date,
cliente int,
descripcion varchar(500),
sub_total numeric(8,2),
descuento numeric(8,2),
iva numeric(8,2),
total numeric(8,2),
fecha_creacion datetime,
fecha_modificacion datetime,
usuario_crea varchar(50),
usuario_modifica varchar(50),
estado varchar(1)
);

create table documento_det(
id_doc_cab int not null,
id_doc_det int not null,
id_producto int not null,
precio numeric(8,2)
);

create table producto(
id_producto int primary key,
nombre varchar(200),
cantidad int,
precio numeric(8,2),
tipo_producto varchar(3),
estado varchar(1)
);

create table producto_combo(
id_producto_combo int,--references producto(id_producto)
id_producto int,--references producto(id_producto)
primary key (id_producto,id_producto_combo)
);
create table menu(
id_menu int,--references producto(id_producto)
id_sub_menu int,--references producto(id_producto)
nombre varchar(100),
direccion varchar(100),
estado varchar(1),
primary key (id_menu)
);

create table menu_x_tipo_usuario(
id_menu int,
tipo_usuario int,
visible varchar(1) not null, 
primary key (id_menu, tipo_usuario)
);

create table evento(
id_evento int primary key,
descripcion varchar(400),
tipo_evento varchar(4),
id_usuario int not null,
fecha_creacion date,
fecha_desde date,
fecha_fin date,
estado varchar(1)
);

alter table menu_x_tipo_usuario add CONSTRAINT CK_menu_x_tipo_usuario_visible check  (visible='S' or visible='N');

alter table evento add CONSTRAINT CK_evento_estado check  (estado='A' or estado='I');


alter table menu add CONSTRAINT CK_menu_estado check  (estado='A' or estado='I');
alter table menu add constraint FK_menu_tipo_usuario foreign key (tipo_usuario) references tipo_usuario (id_tipo_usuario);



alter table persona add constraint U_identificacion unique (identificacion);
alter table persona add constraint U_email unique (email);
alter table persona add CONSTRAINT CK_persona_estado check  (estado='A' or estado='I');
alter table usuario add constraint U_persona unique (nombre_usuario);
alter table usuario add constraint FK_usuario_persona foreign key (persona) references persona (id_persona);
alter table usuario add constraint FK_usuario_tipo_usuario foreign key (tipo_usuario) references tipo_usuario (id_tipo_usuario);
alter table usuario add CONSTRAINT CK_usuario_estado check  (estado='A' or estado='I');

alter table documento_cab add constraint FK_documento_cab_persona foreign key (cliente) references persona(id_persona);
alter table documento_cab add constraint U_cod_documento unique (cod_documento);

alter table documento_cab add CONSTRAINT CK_tipo_doc check  (tipo_doc='FAC' or tipo_doc='COT');
alter table documento_cab add CONSTRAINT CK_documento_cab_estado check  (estado='A' or estado='I');
alter table documento_cab add CONSTRAINT CK_documento_cab_sub_total check  (sub_total>=0);
alter table documento_cab add CONSTRAINT CK_documento_cab_iva check  (iva>=0);
alter table documento_cab add CONSTRAINT CK_documento_cab_total check  (total>=0);

alter table documento_det add constraint FK_documento_det_documento_cab foreign key (id_doc_cab) references documento_cab(id_doc_cab);
alter table documento_det add constraint FK_documento_det_producto foreign key (id_producto) references producto(id_producto);
alter table documento_det add constraint PK_documento_det primary key (id_doc_cab,id_doc_det);

alter table producto add CONSTRAINT CK_tipo_producto check  (tipo_producto='COM' or tipo_producto='SIM');
alter table producto add CONSTRAINT CK_producto_estado check  (estado='A' or estado='I');
alter table producto add CONSTRAINT CK_producto_precio check  (precio>=0);

alter table producto_combo add constraint FK_producto_combo_id foreign key (id_producto) references producto(id_producto);
alter table producto_combo add constraint FK_producto_combo foreign key (id_producto_combo) references producto(id_producto);
